package com.wyw.function.learning.common;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;

/**
 * @Title
 * @Description
 * @Author Mr Wu yewen.wu.china@gmail.com
 * Update History:
 * Author        Time            Content
 */
public class ToListCollector<T> implements Collector<T, List<T>, List<T>> {

    /**
     * 返回空的 Supplier
     * 遍历集合的起点
     *
     * @return 返回空的 Supplier
     */
    @Override
    public Supplier<List<T>> supplier() {
        return ArrayList::new;
    }

    /**
     * 把当前项目添加至已经遍历过的项目的列表
     * 累计遍历过的项目，原为修改累加器
     *
     * @return BiConsumer
     */
    @Override
    public BiConsumer<List<T>, T> accumulator() {
        return List::add;
    }

    /**
     * 修改第一个累加器，将其鱼第二个累加器合并
     * 返回第一个累加器
     *
     * @return BinaryOperator
     */
    @Override
    public BinaryOperator<List<T>> combiner() {
        return ((list1, list2) -> {
            list1.addAll(list2);
            return list1;
        });
    }

    /**
     * 恒等函数
     *
     * @return Function
     */
    @Override
    public Function<List<T>, List<T>> finisher() {
        return Function.identity();
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
    }
}
